package nsq_pay

import (
	sqlc "bp/db/sqlc"
	"bp/internal/util"
	"context"
	"fmt"
)

func GetOrderPayFinishTopic() string {
	return fmt.Sprintf("%s-order_pay_finish", appID)
}

const (
	PAY_ORDER_STATUS_SUCCESS = 2;
	BIZ_MALL = 1;
)

// 支付状态
// enum PayOrderStatus{
//   // 初始状态，待支付（支付单状态）
//   PAY_ORDER_STATUS_INIT = 0;
//   // 支付中（前端已确定支付成功 / 已提交会员支付）（支付单状态）
//   PAY_ORDER_STATUS_PAYING = 1;
//   // 支付成功（支付单状态）
//   PAY_ORDER_STATUS_SUCCESS = 2;
//   // 支付失败（支付单状态）
//   PAY_ORDER_STATUS_FAILED = 3;
//   // 支付关闭（支付单状态）
//   PAY_ORDER_STATUS_CLOSED = 4;
//   // 待提交退款（退款单状态）
//   REFUND_ORDER_STATUS_INIT = 10;
//   // 退款中(第三方返回退款已提交等)（退款单状态）
//   REFUND_ORDER_STATUS_REFUNDING = 11;
//   // 退款成功（退款单状态）
//   REFUND_ORDER_STATUS_SUCCESS = 12;
//   // 退款协商成功（退款单状态）
//   REFUND_ORDER_STATUS_MARKED_SUCCESS = 13;
//   // 退款失败（退款单状态）
//   REFUND_ORDER_STATUS_FAILED = 14;
// }

// 支付单业务类型
// enum BizType{
//   // 不筛选 ~ 用于查询时作为全部匹配
//   _BIZ_TYPE_ALL = 0;
//   // 商城订单
//   BIZ_MALL = 1;
//   // 会员充值订单
//   BIZ_RECHARGE = 2;
//   // 星团订单
//   BIZ_BGS = 3;
// }

type OrderPaySuccessNotification struct {
	OutTransNo string `json:"biz_no"`
	BizType    uint8  `json:"biz_type"`
	PayStatus  uint8  `json:"status"`
}

// HandleOrderPayFinish 处理订单支付完成消息
func (s *NsqPayComServiceImp) HandleOrderPayFinish(ctx context.Context, q *sqlc.Queries, ptr *OrderPaySuccessNotification) (err error) {
	slog := util.NewContextLogger(ctx, s.slog)
	if ptr.PayStatus == PAY_ORDER_STATUS_SUCCESS && ptr.BizType == BIZ_MALL {
		outTransNo := ptr.OutTransNo
		err = s.entityHub.OffTransactionService.MarkOffTransactionDoneByOutTransNo(ctx, q, outTransNo)
		if err != nil {
			return
		}
		err = s.entityHub.MemberCouponService.ApplyMemberCoupons(ctx, q, outTransNo)
		if err != nil {
			return
		}
		slog.Infof("HandleOrderPayFinish-外部交易(%s)使用会员优惠券 ok", outTransNo)
	}
	return
}
